home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / PowerPlant / TCodeModule & Friends / TCodeModule.cp < prev    next >
Text File  |  1996-05-04  |  3KB  |  154 lines

  1. /*
  2.     File:        TCodeModule.cp
  3.     
  4.     Contains:    CFM-based code resource class
  5.                 
  6.     Copyright:    ©1995-1996 Chris K. Thomas.  All Rights Reserved.
  7.     
  8.     Version:    1.0
  9. */
  10.  
  11. // %%% no mixed-mode stuff herein- must be using same runtime
  12. //     as the code module
  13.  
  14. // %%% - doesn't currently support more than one code fragment
  15. //       in the data fork
  16.  
  17. #include "TCodeModule.h"
  18. #include <UException.h>        //PP exceptions
  19.  
  20. // —————• Liftime———————————————————————————————————————————————————————————————
  21. TCodeModule::TCodeModule(FSSpec &inSpec)
  22. {
  23.     mGood = false;
  24.     mSpec = inSpec;
  25.     mResource = NULL;
  26.     mResFileRef = -1;
  27. }
  28.  
  29. TCodeModule::~TCodeModule()
  30. {
  31.     Disconnect();
  32. }
  33.  
  34. // —————• Connections—————————————————————————————————————————————————————————————
  35.  
  36. // * always connect before getting a method
  37. void
  38. TCodeModule::Connect()
  39. {
  40. #if GENERATINGCFM
  41.     OSErr    theErr;
  42.     Str255    errStr;
  43.     Ptr        main;
  44.     
  45.     theErr = GetDiskFragment(&mSpec, 0, kCFragGoesToEOF, "\pEditor", kNewCFragCopy,
  46.                                 &mConnector, &main, errStr);
  47.     
  48.     ThrowIfOSErr_(theErr);
  49.     
  50.     mGood = true;
  51. #else
  52.     DebugStr("\pTCodeModule::Connect() Unimplemented on 68k");
  53. #endif
  54.  
  55. }
  56.  
  57. void
  58. TCodeModule::Connect(ResType inType, long inID)
  59. {
  60.     
  61.     mResFileRef = FSpOpenResFile(&mSpec, fsRdPerm);
  62.     ThrowIfResError_();
  63.     
  64.     mResource = GetResource(inType, inID);
  65.     if(mResource == NULL)
  66.     {
  67.         FSClose(mResFileRef);
  68.         throw 'nilp';
  69.     }
  70.     
  71.     HLockHi(mResource);
  72.     
  73. #if GENERATINGCFM
  74.     Ptr        main;
  75.     Str255    errStr;
  76.     OSErr    theErr;
  77.     
  78.     theErr = GetMemFragment(*mResource, GetHandleSize(mResource), mSpec.name,
  79.                         kNewCFragCopy, &mConnector, &main, errStr);
  80.     
  81.     if(theErr != noErr)
  82.     {
  83.         ReleaseResource(mResource);
  84.         mResource = NULL;
  85.         throw theErr;
  86.     }
  87. #endif
  88. }
  89.  
  90. // * Disconnect is called in the destructor, but doesn't hurt
  91. // * to Disconnect manually.
  92. void
  93. TCodeModule::Disconnect()
  94. {
  95. #if GENERATINGCFM
  96.     if(mGood)
  97.         CloseConnection(&mConnector);
  98. #endif
  99.     if(mResource)
  100.         ReleaseResource(mResource);
  101.         
  102.     if(mResFileRef != -1)
  103.         FSClose(mResFileRef);
  104.         
  105.     mGood = false;
  106.     mResource = NULL;
  107.     mResFileRef = -1;
  108. }
  109.  
  110. // —————• Access——————————————————————————————————————————————————————————————————
  111.  
  112. ProcPtr
  113. TCodeModule::GetMethod(const unsigned char *inMethodName)
  114. // • get the vector address of inMethodName under CFM
  115. // • just return the main entrypoint if old 68k runtime
  116. {
  117. #if (!GENERATINGCFM)
  118. #pragma unused (inMethodName)
  119. #endif
  120.  
  121.     ProcPtr                outAddress = NULL;
  122.     
  123. #if GENERATINGCFM
  124.     ThrowIfNot_(mGood);
  125.     
  126.     OSErr                theErr;
  127.     CFragSymbolClass    fragClass;
  128.     
  129.     theErr = FindSymbol(mConnector, inMethodName, (Ptr*)&outAddress, &fragClass);
  130.     
  131.     // * it’s easier for a calling proc to check for null
  132.     //   than to handle exceptions
  133.     if(theErr == fragSymbolNotFound)
  134.     {
  135.         return NULL;
  136.     }
  137.     else if(theErr != noErr)
  138.     {
  139.         ThrowIfOSErr_(theErr);
  140.     }
  141.     
  142.     if(fragClass != kTVectorCFragSymbol)     // if it's not a transition vector
  143.     {
  144.         throw fragInvalidFragmentUsage;
  145.     }
  146.     
  147. #else
  148.     ThrowIfNULL_(outAddress);
  149.     outAddress = *(ProcPtr*)mResource;
  150. #endif
  151.  
  152.     return outAddress;
  153. }
  154.